Copyright (C) 2020 Andreas Kloeckner
import numpy as np
import numpy.linalg as la
Here's a simple overdetermined linear system, which we'll solve using both the normal equations and the pseudoinverse:
A = np.random.randn(5, 3)
b = np.random.randn(5)
Solve $Ax\cong b$ using the normal equations:
#clear
x1 = la.solve(A.T@A, A.T@b)
x1
Solve $Ax\cong b$ using the pseudoinverse:
U, sigma, VT = la.svd(A)
print(U)
print(sigma)
print(VT)
Sigma_inv = np.zeros_like(A.T)
Sigma_inv[:3,:3] = np.diag(1/sigma)
Sigma_inv
#clear
pinv = VT.T @ Sigma_inv @ U.T
x2 = pinv @ b
x2
la.norm(x1-x2)